package yao.xerophyte.java.thread;

import cn.hutool.log.StaticLog;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 1、extends Thread
 * 2、implements Runnable（jdk8 表达式）
 * 3、线程池
 * 4、Callable
 */
public class HowToCreateThread {
    static class MyThread extends Thread {
        @Override
        public void run() {
            StaticLog.debug("Hello MyThread!");
        }
    }

    static class MyRun implements Runnable {
        @Override
        public void run() {
            StaticLog.debug("Hello MyRun!");
        }
    }

    static class MyCallable implements Callable<Integer>{
    
        @Override
        public Integer call() throws Exception {
            int i=0;
            for(;i<100;i++) {
                StaticLog.debug(Thread.currentThread().getName()+" "+i);
            }
            return i;
        }
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//        new MyThread().start();
//        new Thread(new MyRun()).start();
//        new Thread(()->{
//            StaticLog.info("Hello Lambda!");
//        }).start();
        
        //创建Callable的对象
        MyCallable ca=new MyCallable();
        FutureTask<Integer> ft=new FutureTask<>(ca);
        for(int i=0;i<100;i++) {
            //返回值主线程的名称和执行代号
            StaticLog.debug(Thread.currentThread().getName()+" "+i);
            if(i==20) {
                new Thread(ft,"Callable线程").start();
                //该方法将导致主线程被阻塞，直到call()方法结束并返回为止
//                StaticLog.info("子线程的返回值"+ft.get()); 
            }
        }
        try{
            //在什么地方调用get，主线程就在什么地方等待子线程结束
            StaticLog.debug("子线程的返回值"+ft.get());
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}

//请你告诉我启动线程的三种方式 1：Thread 2: Runnable 3:Executors.newCachedThrad
